package com.santu.com.util;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * @author luoyaoqi
 * @createTime 2022/7/8
 * @description
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiLock {

    /**
     * 获取锁等待时间
     */
    long waitMills();

    /**
     * 锁自动过期时间
     */
    long expireMills();

    /**
     *时间单位
     */
    TimeUnit timeunit();

    /**
     * 声明当前接口需从HttpServletRequest上下文中获取的参数(request.getAttribute(attr))
     * （只支持从方法参数HttpServletRequest中获取，如果填入该值则会获取并参与lock key的拼接）
     */
    String[] requiredRequestAttrs() default {};


    /**
     * 声明当前接口需从请求头中获取的参数(request.getHeader(header))
     * （只支持从方法参数HttpServletRequest中获取，如果填入该值则会获取并参与lock key的拼接）
     */
    String[] requiredHeaders() default {};


    /**
     *加锁策略
     */
    Class<? extends ApiLockKeyGenerateStrategy> generateStrategy() default ApiLockKeyDefaultGenerateStrategy.class;
}
